/*
原子操作补充：
一般可以用操作符++，+=，--，-=，&=，|=，^=其他的可能不支持

async深入讲解：

async的两个参数：
std::launch::deferred延迟调用；std::launch::saync强制创建线程
async我们一般不叫创建线程的函数，而是叫做创建异步任务

defrred:延迟到future对象调用get（）或wait（）才创建新线程并调用线程入口函数，反之，则不创建线程
async：强制异步任务在新线程上运行，这意味着系统必须创建新线程
defrred|async   意味着调用async的行为可能是defrred参数状态也可能是async状态，这个有系统决定

更正：如果不传入launch参数，则默认为defrred|async
系统自行决定是以异步（创建新线程）还是同步（不创建新线程）方式运行

区别：
thread()创建线程会在内存不足的情况下创建线程失败，而导致程序崩溃
async（默认参数）在系统资源紧张时系统选择使用延迟调用deferred，并且是在get（）/wait（）语句相应的线程中执行入口函数，而不是新建线程
如果不用默认参数，而是用async强制新建线程，当内存不足时也会崩溃

async有时并不是立即创建线程
thread会立即创建线程
如果使用thread创建线程，会使函数的返回值接收复杂，需要用package-task，promise等
如果使用async创建异步任务，可以直接使用async返回对象future来得到返回值，容易拿到入口函数的返回值
 
没有默认参数的async会导致一些不确定性问题
系统决定是否创建线程
问题在于 future<int> result=async(mythread)的这种写法
这个异步任务到底有没有被退出执行，即系统选择了async还是deferred
使用future的wait-for（）函数



*/




#include<iostream>
#include<string>
#include<thread>
#include<mutex>

using namespace std;

//atomic<int> g_count=0;

//原子操作运算符的适配：
// void mythread(){
//     for(int i=0;i<100000;i++){
//         //原子操作不会被打断
//         //g_count++;
//         //g_count+=1;
//         //开启多个线程，同用这个入口函数，上两行代码都正确，但是下行代码出现问题
//         g_count=g_count+1;
//     }
//     return ;
// }


//线程入口函数
int mythread(){
    cout << "mythread() start" << "threadid" << this_thread::get_id() << endl;
    //线程等待5秒
    chrono::milliseconds drua(5000);
    this_thread::sleep_for(dura)
    return 1;
}

int main(int argc,char**argv){

    // thread mytobj(mythread);
    // thread mytobj2(mythread);
    // mytobj.join();
    // mytobj2.join();
    // cout<<"g_count ="<<g_count<<endl;


    // cout << "main" << "threadID" << this_thread::get_id() << endl;
    // std::future<int> result=std::async(mythread);
    // //取得函数的返回值
    // cout<<result.get()<<endl;


    //测试系统默认调用参数
    //接收的对象等待0秒即可
    //std::future_status status = result.wait_for(std::chrono::seconds(0));
    //下列写法 同样可以，重载了什么东西，也可以是分钟min，ms毫秒等
    std::future_status status = result.wait_for(0s)
    if(status==future_status::deferred){
        //cout<<"资源紧张了，延迟调用系统采用了deferred"<<endl;
        //这时才调用mythread（）
        cout<<result.get()<<endl;
    }
    else if(status==future_status::ready){

            //表示线程返回
    		cout << "成功返回" << endl;
	    	cout << result.get() << endl;

    }
	else if (status == std::future_status::timeout)
	{
		//表示程序还没有执行完成
		cout << "等待超时" << endl;
        cout << result.get() << endl;
	}
	



    return 0;
}